/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.camachosanchez.reportes;

import com.camachosanchez.bean.Egresos;
import com.camachosanchez.bean.Pilotos;
import com.camachosanchez.util.Constantes;
import com.camachosanchez.util.JPAUtil;
import com.camachosanchez.util.ReportUtil;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.swing.JOptionPane;

/**
 *
 * @author ZULLY
 */
public class ReporteEgresos {

    private EntityManagerFactory emf;
    private EntityManager em;

    public ReporteEgresos() {
        emf = JPAUtil.getEntityManagerFactory();
        em = emf.createEntityManager();
    }

    public void generarReporte(Date fechaIni, Date fechaFin) {
        Document document = new Document(PageSize.A4, 0, 0, 30, 30);
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
            SimpleDateFormat formatterName = new SimpleDateFormat("ddMMyyyy");
            String nombrePdf = "reportes/egresos_detallado" + formatterName.format(fechaIni) + "-" + formatterName.format(fechaFin) + ".pdf";
            PdfWriter.getInstance(document, new FileOutputStream(nombrePdf));
            document.open();
            PdfPTable tablaC = new PdfPTable(1);
            tablaC.setHorizontalAlignment(Element.ALIGN_CENTER);
            tablaC.setWidthPercentage(85);

            PdfPCell celda = new PdfPCell(new Paragraph("EGRESOS: "  + formatter.format(fechaIni) + " - " + formatter.format(fechaFin),
                    FontFactory.getFont(BaseFont.HELVETICA, 12, Font.NORMAL, BaseColor.BLACK)));
            celda.setHorizontalAlignment(Element.ALIGN_CENTER);
            celda.setBorder(Rectangle.NO_BORDER);
            tablaC.addCell(celda);
            document.add(tablaC);

            float[] anchoCols = {7f, 2f, 2f, 3f};
            PdfPTable tablaEgresos = new PdfPTable(anchoCols);
            tablaEgresos.setWidthPercentage(85);
            tablaEgresos.setSpacingBefore(10f);

            tablaEgresos.addCell(ReportUtil.getCelda("PILOTO", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaEgresos.addCell(ReportUtil.getCelda("LLANTA", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaEgresos.addCell(ReportUtil.getCelda("VIGILANTE", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaEgresos.addCell(ReportUtil.getCelda("TOTAL", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));

            List<Egresos> egresos = getDatos(fechaIni, fechaFin);
            BigDecimal montoLlantas = BigDecimal.valueOf(0);
            BigDecimal montoVigilante = BigDecimal.valueOf(0);
            BigDecimal totalLlantas = BigDecimal.valueOf(0);
            BigDecimal totalVigilante = BigDecimal.valueOf(0);
            if (!egresos.isEmpty()) {
                Integer idPiloto = egresos.get(0).getIdPilotos().getId();
                for (Egresos item : egresos) {
                    if (!item.getIdPilotos().getId().equals(idPiloto)) {
                        tablaEgresos.addCell(ReportUtil.getCelda("SUB-TOTAL", 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                        tablaEgresos.addCell(ReportUtil.getCelda(montoLlantas.toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                        tablaEgresos.addCell(ReportUtil.getCelda(montoVigilante.toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                        tablaEgresos.addCell(ReportUtil.getCelda((montoLlantas.add(montoVigilante)).toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                        montoLlantas = BigDecimal.valueOf(0);
                        montoVigilante = BigDecimal.valueOf(0);
                    }

                    tablaEgresos.addCell(ReportUtil.getCelda(item.getIdPilotos().getApellidos() + " " + item.getIdPilotos().getNombres(), 1, 1, BaseColor.WHITE, 0, 0.5f, 8, 0));

                    if (item.getTipo() == Constantes.TIPO_LLANTAS) {
                        tablaEgresos.addCell(ReportUtil.getCelda(item.getMonto().toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 0));
                        tablaEgresos.addCell(ReportUtil.getCelda("", 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 0));
                        montoLlantas = montoLlantas.add(item.getMonto());
                        totalLlantas = totalLlantas.add(item.getMonto());
                    } else {
                        tablaEgresos.addCell(ReportUtil.getCelda("", 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 0));
                        tablaEgresos.addCell(ReportUtil.getCelda(item.getMonto().toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 0));
                        montoVigilante = montoVigilante.add(item.getMonto());
                        totalVigilante = totalVigilante.add(item.getMonto());
                    }
                    tablaEgresos.addCell(ReportUtil.getCelda(item.getMonto().toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 0));

                    idPiloto = item.getIdPilotos().getId();
                }
                //agrega el último sub total
                tablaEgresos.addCell(ReportUtil.getCelda("SUB-TOTAL", 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                tablaEgresos.addCell(ReportUtil.getCelda(montoLlantas.toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                tablaEgresos.addCell(ReportUtil.getCelda(montoVigilante.toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                tablaEgresos.addCell(ReportUtil.getCelda((montoLlantas.add(montoVigilante)).toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));

                tablaEgresos.addCell(ReportUtil.getCelda("TOTAL GENERAL", 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                tablaEgresos.addCell(ReportUtil.getCelda(totalLlantas.toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                tablaEgresos.addCell(ReportUtil.getCelda(totalVigilante.toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                tablaEgresos.addCell(ReportUtil.getCelda((totalLlantas.add(totalVigilante)).toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
            }

            document.add(tablaEgresos);
            document.close();
            File pdfFile = new File(nombrePdf);
            if (Desktop.isDesktopSupported()) {
                Desktop.getDesktop().open(pdfFile);
            } else {
                JOptionPane.showMessageDialog(null, "No se puede abrir el reporte.", "Error al abrir el archivo", JOptionPane.ERROR_MESSAGE);
            }
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }

    public void generarReporteResumido(Date fechaIni, Date fechaFin) {
        Document document = new Document(PageSize.A4, 0, 0, 30, 30);
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
            SimpleDateFormat formatterName = new SimpleDateFormat("ddMMyyyy");
            String nombrePdf = "reportes/egresos_resumido" + formatterName.format(fechaIni) + "-" + formatterName.format(fechaFin) + ".pdf";
            PdfWriter.getInstance(document, new FileOutputStream(nombrePdf));
            document.open();
            PdfPTable tablaC = new PdfPTable(1);
            tablaC.setHorizontalAlignment(Element.ALIGN_CENTER);
            tablaC.setWidthPercentage(85);

            PdfPCell celda = new PdfPCell(new Paragraph("EGRESOS: "  + formatter.format(fechaIni) + " - " + formatter.format(fechaFin),
                    FontFactory.getFont(BaseFont.HELVETICA, 12, Font.NORMAL, BaseColor.BLACK)));
            celda.setHorizontalAlignment(Element.ALIGN_CENTER);
            celda.setBorder(Rectangle.NO_BORDER);
            tablaC.addCell(celda);
            document.add(tablaC);

            float[] anchoCols = {7f, 2f, 2f, 3f};
            PdfPTable tablaEgresos = new PdfPTable(anchoCols);
            tablaEgresos.setWidthPercentage(85);
            tablaEgresos.setSpacingBefore(10f);

            tablaEgresos.addCell(ReportUtil.getCelda("PILOTO", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaEgresos.addCell(ReportUtil.getCelda("LLANTA", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaEgresos.addCell(ReportUtil.getCelda("VIGILANTE", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaEgresos.addCell(ReportUtil.getCelda("TOTAL", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));

            List<Egresos> egresos = getDatos(fechaIni, fechaFin);
            BigDecimal montoLlantas = BigDecimal.valueOf(0);
            BigDecimal montoVigilante = BigDecimal.valueOf(0);
            BigDecimal totalLlantas = BigDecimal.valueOf(0);
            BigDecimal totalVigilante = BigDecimal.valueOf(0);
            if (!egresos.isEmpty()) {
                Integer idPiloto = egresos.get(0).getIdPilotos().getId();
                Pilotos piloto = egresos.get(0).getIdPilotos();
                for (Egresos item : egresos) {
                    if (!item.getIdPilotos().getId().equals(idPiloto)) {
                        tablaEgresos.addCell(ReportUtil.getCelda(piloto.getApellidos() + " " + piloto.getNombres(), 1, 1, BaseColor.WHITE, 0, 0.5f, 8, 0));
                        tablaEgresos.addCell(ReportUtil.getCelda(montoLlantas.toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 0));
                        tablaEgresos.addCell(ReportUtil.getCelda(montoVigilante.toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 0));
                        tablaEgresos.addCell(ReportUtil.getCelda((montoLlantas.add(montoVigilante)).toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 0));
                        montoLlantas = BigDecimal.valueOf(0);
                        montoVigilante = BigDecimal.valueOf(0);
                    }
                    if (item.getTipo() == Constantes.TIPO_LLANTAS) {
                        montoLlantas = montoLlantas.add(item.getMonto());
                        totalLlantas = totalLlantas.add(item.getMonto());
                    } else {
                        montoVigilante = montoVigilante.add(item.getMonto());
                        totalVigilante = totalVigilante.add(item.getMonto());
                    }

                    piloto = item.getIdPilotos();
                    idPiloto = item.getIdPilotos().getId();
                }
                //agrega el último sub total
                tablaEgresos.addCell(ReportUtil.getCelda(piloto.getApellidos() + " " + piloto.getNombres(), 1, 1, BaseColor.WHITE, 0, 0.5f, 8, 0));
                tablaEgresos.addCell(ReportUtil.getCelda(montoLlantas.toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 0));
                tablaEgresos.addCell(ReportUtil.getCelda(montoVigilante.toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 0));
                tablaEgresos.addCell(ReportUtil.getCelda((montoLlantas.add(montoVigilante)).toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 0));

                tablaEgresos.addCell(ReportUtil.getCelda("TOTAL GENERAL", 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                tablaEgresos.addCell(ReportUtil.getCelda(totalLlantas.toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                tablaEgresos.addCell(ReportUtil.getCelda(totalVigilante.toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
                tablaEgresos.addCell(ReportUtil.getCelda((totalLlantas.add(totalVigilante)).toString(), 1, 1, BaseColor.WHITE, 2, 0.5f, 8, 1));
            }

            document.add(tablaEgresos);
            document.close();
            File pdfFile = new File(nombrePdf);
            if (Desktop.isDesktopSupported()) {
                Desktop.getDesktop().open(pdfFile);
            } else {
                JOptionPane.showMessageDialog(null, "No se puede abrir el reporte.", "Error al abrir el archivo", JOptionPane.ERROR_MESSAGE);
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error al abrir el archivo", JOptionPane.ERROR_MESSAGE);
        }
    }

    private List<Egresos> getDatos(Date fechaIni, Date fechaFin) {
        java.sql.Date sqlFechaIni = new java.sql.Date(fechaIni.getTime());
        java.sql.Date sqlFechaFin = new java.sql.Date(fechaFin.getTime());
        Query q1 = em.createQuery("SELECT E FROM Egresos E"
                + " WHERE E.fecha >= :fechaIni AND E.fecha <= :fechaFin AND E.anulado=0"
                + " ORDER BY E.idPilotos.apellidos, E.tipo DESC, E.fecha");
        q1.setParameter("fechaIni", sqlFechaIni);
        q1.setParameter("fechaFin", sqlFechaFin);
        return q1.getResultList();
    }
    /* private List<Egresos> getDatosResumido(Date fechaIni, Date fechaFin){
    java.sql.Date sqlFechaIni = new java.sql.Date(fechaIni.getTime());
    java.sql.Date sqlFechaFin = new java.sql.Date(fechaFin.getTime());
    Query q1 = em.createQuery("SELECT E.idPiloto.apellidos, E.idPilotos.nombres, SUM(E.montoLlantas) AS Monto, E.tipo FROM Egresos E"
    + " WHERE E.fecha >= :fechaIni AND E.fecha <= :fechaFin AND E.anulado=0"
    + " GROUP BY E.idPiloto.apellidos, E.tipo ORDER BY E.idPilotos.apellidos, E.tipo DESC, E.fecha");
    q1.setParameter("fechaIni", sqlFechaIni);
    q1.setParameter("fechaFin", sqlFechaFin);
    return q1.getResultList();
    }*/
}
